// -*- coding: utf-8 -*- 
/**
 * Project: AlgorithmsLearn
 *
 * @author: yanking
 * Create time: 2022-04-02 17:18
 * IDE: IntelliJ IDEA
 * Introduction:
 */
package com.LeetCodeT.DateTrain;

import java.util.Arrays;

public class StrongPasswordChecker {
    /**
     * 强密码检验器:
     * 分类讨论：
     */
    public int strongPasswordChecker(String password) {
        int n = password.length(), ans = 0;
        /*
         *  判断字符、数字:
         *  强密码至少包含一个小写、大写、数字
         */
        int[] dn = new int[3];
        Arrays.fill(dn, 1);
        for (int i = 0; i < n; i++) {
            char c = password.charAt(i);
            if (Character.isDigit(c) && dn[0] > 0) {
                dn[0]--;
            } else if (Character.isLowerCase(c) && dn[1] > 0) {
                dn[1]--;
            } else if (Character.isUpperCase(c) && dn[2] > 0) {
                dn[2]--;
            }
        }
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += dn[i];
        }
        // 判断是否存在连续的三个重复元素
        char[] pw = password.toCharArray();
        int tn = 0;
        for (int i = 0; i < Math.min(n, 20); i++) {
            if (i < n - 2 && (pw[i] == pw[i + 1] && pw[i] == pw[i + 2])) {
                tn++;
                i += 3;
            }
        }

        // 1 当密码长度不在强密码范围内（6 - 20）
        if (n < 6) {
            ans += Math.max(sum, (6 - n)) + tn;
        } else if (n > 20) {
            ans += n - 20 + Math.max(tn, sum);
        }
        // 2 密码长度在强密码范围

        return ans;
    }


}
